# 1 找到未加密的参数
# 2 想办法把参数进行加密（必须参考网易的逻辑），params   encSecKey
#                                            # params: bMr5w.encText,
#                                            # encSecKey: bMr5w.encSecKey
# 3 请求到网易，拿到数据

# pycrypto
# pip install pycryptodome  # 安装这个包替代pycrypto
import requests
from Crypto.Cipher import AES
from base64 import b64encode
import json

url = 'https://music.163.com/weapi/comment/resource/comments/get?csrf_token='

# 请求方式是post

data = {
    'csrf_token': "",
    'cursor': "-1",
    'offset': "0",
    'orderType': "1",
    'pageNo': "1",
    'pageSize': "20",
    'rid': "R_SO_4_1805620091",
    'threadId': "R_SO_4_1805620091"
}

# 处理加密过程
f = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7'
e = '010001'
g = '0CoJUm6Qyw8W8jud'
i = '"WumILUscYvsYYpY4"'  # 把i的到值定死


def get_encSecKey():
    return '"b56331abd3e4b8e28be0e4bd17e0463b6181fb6c7b99617796de65092cf83f5bd3a5d105be8e9fddbd63cff0e6e2540a3fedf9b8519dfa920acc7f29bb8a0810823b0b9769b33ef71771aa90aa3c326865c701aac9e67fe9d4b8c98e06cc604c02a0cb12e3b3f46e61a72218fc76592a596a77dd4bc14c53c552afe2644b88b6"'


def get_params(data):  # 默认这里的接收到的是字符拆
    first = enc_params(data, g)
    second = enc_params(first, i)
    return second  # 返回的就是params


def to_16(data):
    pad = 16 - len(data) % 16
    data += chr(pad) * pad
    return data


def enc_params(data, key):  # 加密过程
    iv = '0102030405060708'
    data = to_16(data)
    aes = AES.new(key=key.encode('utf-8'), IV=iv.encode('utf-8'), mode=AES.MODE_CBC)  # 创建一个加密的工具（加密器）
    bs = aes.encrypt(data.encode('utf-8'))  # 加密, 加密的内容的长度必须是16的倍数
    return str(b64encode(bs), 'utf-8')  # 转换成字符串返回


# 处理加密的过程
"""
    function a(a = 16) {    # 返回随机的16位字符串
        var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";
        for (d = 0; a > d; d += 1)      # 循环16次
            e = Math.random() * b.length,   # 随机数
            e = Math.floor(e),      # 取整
            c += b.charAt(e);       # 取字符串中xx的位置
        return c
    }
    function b(a, b) {  # a是要加密的内容
        var c = CryptoJS.enc.Utf8.parse(b)      # c 是密钥 所有b就是密钥
          , d = CryptoJS.enc.Utf8.parse("0102030405060708")
          , e = CryptoJS.enc.Utf8.parse(a)      # e是数据
          , f = CryptoJS.AES.encrypt(e, c, {    # c就是加密的密钥
            iv: d,  # iv 偏移量
            mode: CryptoJS.mode.CBC     # 模式: CBC
        });
        return f.toString()     # 把f变成字符串
    }
    function c(a, b, c) {   # c 里面不产生随机数
        var d, e;
        return setMaxDigits(131),
        d = new RSAKeyPair(b,"",c),
        e = encryptedString(d, a)
    }
    function d(d, e, f, g) {        # d: 数据 -- e；010001 -- f：{f} -- g: 0CoJUm6Qyw8W8jud
        var h = {}      # 空对象
          , i = a(16);      # i就是一个随机的16位的随机值   把i设置成固定的 c才能不产生随机树数
        return h.encText = b(d, g),     # g就是密钥
        h.encText = b(h.encText, i),    # 返回的就是 params  # i是密钥
        h.encSecKey = c(i, e, f),       # 返回的就是 encSecKey c和f是固定的，如果把i的的值固定， 得到的encSecKey 一定也是固定的
        h
    }
    
    # params ： 两次加密 
        # 第一次是把数据 + g 得到第一次加密的结果
        # 第二次是把 第一次的结果 + i 得到 params
"""

resp = requests.post(url=url, data={
    "params": get_params(json.dumps(data)),
    "encSecKey": get_encSecKey()
})

print(resp.text)
